#include "client_module.h"

// 用户信息存储结构体
struct user_info {
	char user_name[32];                  // 专门存放用户名字
	char user_passwd[32];                // 专门存放用户密码
	char user_phone[32];                 // 专门存放用户手机
	char user_address[32];               // 专门存放用户地址    
};

/* 增加普通用户操作 */
void add_user(int fd) {
	// 1 -- 输入用户名
	// 2 -- 输入用户密码
	// 3 -- 输入用户联系方式
	// 4 -- 输入用户地址
	int ret;
	struct user_info userinfo;

	printf("input name:");
	scanf("%s", userinfo.user_name);
	getchar();
	printf("input passwd:");
	scanf("%s", userinfo.user_passwd);
	getchar();
	printf("input phone:");
	scanf("%s", userinfo.user_phone);
	getchar();
	printf("input addr:");
	scanf("%s", userinfo.user_address);
	getchar();
	send(fd, &userinfo, sizeof(userinfo), 0); // 向服务器发送用户信息
	recv(fd, &ret, 4, 0);					// 接受服务器的反馈信息
	if(ret == 0)
	{
		printf("add user sueecss\n");
	}else{
		printf("add user fail\n");
	}
}
// 管理员查询指定用户
void query_user(int fd)
{
	struct user_info userinfo;

	printf("input name:");
	scanf("%s", userinfo.user_name);    
	getchar();
	send(fd, &userinfo, sizeof(userinfo), 0);   // 向服务器发送用户信息
	recv(fd, &userinfo, sizeof(userinfo), 0);   // 接受服务器的反馈信息
	if(strcmp(userinfo.user_name, "wrong") == 0)
	{
		printf("fail to query\n");
	}else{
		printf("name:%s password:%s phone:%s addr:%s\n", userinfo.user_name, userinfo.user_passwd, userinfo.user_phone, userinfo.user_address);		
	}

}
// 管理员删除指定用户
void del_user(int fd)
{
	int ret;
	struct user_info userinfo;

	printf("input name:");
	scanf("%s", userinfo.user_name);
	getchar();
	send(fd, &userinfo, sizeof(userinfo), 0);  // 向服务器发送用户信息
	recv(fd, &ret, 4, 0);					// 接受服务器的反馈信息
	if(ret == 0)
	{
		printf("del success\n");
	}else{
		printf("fail to del user\n");
	}
}
// 管理员更新指定用户
void update_user(int fd)
{
	int ret;
	struct user_info userinfo;

	printf("input name:");
	scanf("%s", userinfo.user_name);
	getchar();
	printf("input new password:");
	scanf("%s", userinfo.user_passwd);
	getchar();
	send(fd, &userinfo, sizeof(userinfo), 0);	// 向服务器发送用户信息
	recv(fd, &ret, 4, 0);						// 接受服务器的反馈信息
	if(ret == 0)
	{
		printf("update success\n");
	}else{
		printf("fail to update\n");
	}
}
// 普通用户查询
void user_query(int fd, char *loguser)
{
	struct user_info userinfo;

	strcpy(userinfo.user_name, loguser);
	send(fd, &userinfo, sizeof(userinfo), 0);	// 向服务器发送用户信息
	recv(fd, &userinfo, sizeof(userinfo), 0);	// 接受服务器的反馈信息
	if(strcmp(userinfo.user_name, "wrong") == 0)
	{
		printf("fail to query\n");
	}else{
		printf("name:%s password:%s phone:%s addr:%s\n", userinfo.user_name, userinfo.user_passwd, userinfo.user_phone, userinfo.user_address);		
	}
}
// 普通用户更改自己密码
void user_update_passwd(int fd, char *loguser)
{
	int ret;
	struct user_info userinfo;

	strcpy(userinfo.user_name, loguser);
	printf("input new password:");
	scanf("%s", userinfo.user_passwd);
	getchar();
	send(fd, &userinfo, sizeof(userinfo), 0);	// 向服务器发送用户信息
	recv(fd, &ret, 4, 0);						// 接受服务器的反馈信息
	if(ret == 0)
	{
		printf("update success\n");
	}else{
		printf("fail to update\n");
	}


}
// 普通用户查询指定用户特定信息
void user_query_other_people(int fd)
{
	struct user_info userinfo;

	printf("input name:");
	scanf("%s", userinfo.user_name);
	getchar();

	send(fd , &userinfo, sizeof(userinfo), 0);	// 向服务器发送用户信息
	recv(fd, &userinfo, sizeof(userinfo), 0);	// 接受服务器的反馈信息
	if(strcmp(userinfo.user_name, "wrong") == 0)
	{
		printf("no user\n");
	}else{
		printf("name:%s passwd:%s phone:%s addr:%s\n", userinfo.user_name, userinfo.user_passwd, userinfo.user_phone, userinfo.user_address);
	}
}
// 显示服务器文件
void list_file(int fd)
{
	char buf[256] = {0};

	while(1)
	{
		recv(fd, buf, 256, 0);		// 接受服务器信息
		if(strcmp(buf, "over") == 0)	// 判断是否接受结束
		{
			break;
		}
		if(strcmp(buf, "fail") == 0)  // 判断是否接受失败
		{
			printf("fail to list\n");
			break;
		}
		printf("%s\n", buf);		// 打印服务器信息
	}
	printf("list file over\n");
}
// 向服务器上传文件
void put_file(int fd)
{
	int f_fd;
	int ret;
	char buf[128] = {0};
	char filename[128] = {0};

	printf("input you file name:");
	scanf("%s", filename);			
	getchar();
	
	f_fd = open(filename, O_RDONLY);
	if (f_fd < 0)						// 判断上传文件是否能打开正常
	{
		perror("fail to open file:");
		strcpy(filename, "fail");
		send(fd, filename, 128, 0);
		return;
	}
	send(fd, filename, 128, 0);			// 向服务器上传文件名
	recv(fd, buf, 128, 0);				// 接受服务器反馈信息是否能上传
	if(strcmp(buf, "fail") == 0)
	{
		printf("fail to put file\n");
		return;
	}
	while((ret = read(f_fd, buf, 128)) > 0) // 把文件信息传送给服务器
	{
		if (ret < 128)						// 读取文件到结尾了
		{
			send(fd, buf, ret, 0);
			break;
		}
		send(fd, buf, 128, 0);
	}
	printf("put over\n");
}
// 从服务器上下载文件
void load_file(int fd)
{
	int f_fd;
	int ret;
	char buf[128] = {0};
	char filename[128] = {0};
	
	printf("input you file name:");
	scanf("%s", filename);
	getchar();
	send(fd, filename, 128, 0);    // 向服务器上传需要下载文件名字
	recv(fd, buf, 128, 0);		// 接受服务器反馈，判断文件是否能下载
	
	if(strcmp(buf, "fail") == 0)
	{
		printf("fail to load file\n");
		return;
	}
	
	f_fd = open(filename, O_RDWR|O_CREAT, 0777); // 在本地创建文件接受信息
	if(f_fd < 0)
	{
		printf("fail to creat file\n");
		send(fd, "fail", 128, 0);
		return;
	}
	send(fd, "ok", 128, 0);

	while((ret = recv(fd, buf, 128, 0)) > 0) // 接受服务器发送来的信息
	{
		write(f_fd, buf, ret);
		if(ret < 128)		// 传送到了文件结尾，不加的话，recv还是会阻塞接受，因为服务器没退出
		{
			break;
		}
	}
	printf("load over\n");

}
